#ifndef __IP_H__
#define __IP_H__
#include "ip_addr.h"
#include "stm32f4xx.h"
#include "malloc.h"
#include "string.h"

#define IP_PCB_ADDRHINT
#define Version_ip           0x40
#define udphdr_len              8
#define IPH_V(hdr)  ((hdr)->vhl >> 4)
#define IPH_HL(hdr) ((hdr)->vhl & 0x0f)



#define IP_PROTO_ICMP    1
#define IP_PROTO_IGMP    2
#define IP_PROTO_UDP     17
#define IP_PROTO_UDPLITE 136
#define IP_PROTO_TCP     6



#define IP_PCB\
  ip_addr_t local_ip;\
  ip_addr_t remote_ip;\
  uint8_t so_options;
  IP_PCB_ADDRHINT

struct ip_pcb {
  IP_PCB
};  
  
typedef struct{ //以太网头部+IP首部结构
  uint8_t        vhl;         //4位版本号4位首部长度(0x45)
  uint8_t        tos;         //服务类型(0)
  uint16_t       tot_len;     //整个IP数据报总字节长度
  uint16_t       ipid;        //IP标识
  uint16_t       ipoffset;    //3位标识13位偏移
  uint8_t        ttl;         //生存时间(32或64)
  uint8_t        protocol;    //协议(1表示ICMP,2表示IGMP,6表示TCP,17表示UDP)
  uint16_t       ipchksum;    //首部校验和
  uint32_t        srcipaddr;    //源IP
  uint32_t        destipaddr;   //目的IP
}Pack_ip_hdr;


/*
**IP校验和
*/
uint16_t 
ip_checksum(uint8_t *buff,uint8_t size);

#endif
